package org.alwayssuper.protocol.commons.transform.realtimev2025;

import org.alwayssuper.protostar.annotation.Field;
import lombok.Data;
import lombok.ToString;
import lombok.experimental.Accessors;

/**
 * 签名数据 (0xFF)
 * 用于数据完整性和防篡改验证
 * 基于GB/T 32960.3-2025标准
 * 
 * @author alwaysSuper
 */
@ToString
@Data
@Accessors(chain = true)
public class SignatureData {
    
    /**
     * 签名类型
     * 0x01: 数据经过SM2算法加密
     * 0x02: 数据经过RSA算法加密  
     * 0x03: 数据经过ECC算法加密
     * 其他: 预留
     */
    @Field(length = 1, desc = "签名类型")
    private byte signatureType;
    
    /**
     * 签名R值
     * 签名实际R值，前两个字节确定签名数据R值长度
     */
    @Field(lengthUnit = 2, desc = "签名R值")
    private byte[] rValue;
    
    /**
     * 签名S值  
     * 签名实际S值，前两个字节确定签名数据S值长度
     */
    @Field(lengthUnit = 2, desc = "签名S值")
    private byte[] sValue;
    
    /**
     * 获取签名类型名称
     * @return 签名类型描述
     */
    public String getSignatureTypeName() {
        switch (signatureType) {
            case 0x01: return "SM2算法";
            case 0x02: return "RSA算法";
            case 0x03: return "ECC算法";
            default: return "预留(" + String.format("0x%02X", signatureType) + ")";
        }
    }
    
    /**
     * 验证签名数据完整性
     * @return 是否有效
     */
    public boolean isValid() {
        return signatureType >= 0x01 && signatureType <= 0x03 
            && rValue != null && rValue.length > 0
            && sValue != null && sValue.length > 0;
    }
    
    /**
     * 获取签名数据总长度
     * @return 字节总长度
     */
    public int getTotalLength() {
        int length = 1; // signatureType
        if (rValue != null) {
            length += 2 + rValue.length; // lengthUnit + rValue
        }
        if (sValue != null) {
            length += 2 + sValue.length; // lengthUnit + sValue
        }
        return length;
    }
}